#ifndef NIMSERVOSDK_H
#define NIMSERVOSDK_H

#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
    #if defined(NIMSERVOSDK_LIBRARY)
        #  define NIMSERVOSDKSHARED_EXPORT __declspec(dllexport)
    #else
        #  define NIMSERVOSDKSHARED_EXPORT __declspec(dllimport)
    #endif

    #define NIMAPI __cdecl

#else
    #define NIMSERVOSDKSHARED_EXPORT
    #define NIMAPI
#endif

#ifdef __cplusplus
extern "C"
{
#endif

enum CanBaudRate
{
    CAN_BT_10K = 0,
    CAN_BT_20K,
    CAN_BT_50K,
    CAN_BT_100K,
    CAN_BT_125K,
    CAN_BT_250K,
    CAN_BT_500K,
    CAN_BT_800K,
    CAN_BT_1000K
};

enum ServoWorkMode
{
    SERVO_PP_MODE = 1,  //轮廓位置模式     PP
    SERVO_VM_MODE = 2,  //速度模式        VM
    SERVO_PV_MODE = 3,  //轮廓速度模式     PV
    SERVO_PT_MODE = 4,  //轮廓转矩模式     PT
    SERVO_HM_MODE = 6,  //原点回归模式     HM
    SERVO_IP_MODE = 7,  //位置插补模式     IP
    SERVO_CSP_MODE,     //循环同步位置模式  CSP
    SERVO_CSV_MODE,     //循环同步速度模式  CSV
    SERVO_CST_MODE      //循环同步转矩模式  CST
};

enum ServoSDK_Error
{
    ServoSDK_NoError = 0,           //没有错误
    ServoSDK_NotRegisted,           //SDK没有注册
    ServoSDK_NotInitialized,        //SDK没有初始化
    ServoSDK_UnsupportedCommType,   //不支持的通信方式
    ServoSDK_ParamError,            //输入参数错误
    ServoSDK_MasterStartFailed,     //主站启动失败
    ServoSDK_MasterNotRunning,      //主站未运行
    ServoSDK_SlaveNotOnline,        //从站不在线
    ServoSDK_LoadParamSheetFailed,  //加载参数表错误
    ServoSDK_ParamNotExist,         //请求的参数不存在
    ServoSDK_ReadSDOFailed,         //读SDO失败
    ServoSDK_WriteSDOFailed,        //写SDO失败
    ServoSDK_OperationNotAllowed,   //操作不允许
    ServoSDK_MasterInternalError,   //主站内部错误
    ServoSDK_SlaveInternalError,    //从站内部错误
    ServoSDK_Cia402ModeError,       //从站402模式错误
    ServoSDK_ReadWorkModeFailed,    //读取工作模式失败
    ServoSDK_ReadStatusWordFailed,  //读取状态字失败
    ServoSDK_ReadCurrentPosFailed,  //读取当前位置失败
    ServoSDK_ReadRPDOConfigFailed,  //读取PDO配置失败
    ServoSDK_ReadTPDOConfigFailed,  //读取PDO配置失败
    ServoSDK_WriteControlWordFailed,  //写控制字失败
    ServoSDK_WriteTargetPosFailed,  //写目标位置失败
    ServoSDK_WriteTargetVelFailed,  //写目标速度失败
    ServoSDK_WriteGoHomeTypeFailed,  //写原点回归方式失败
    ServoSDK_GetHostInfoFailed,     //获取主机信息失败
    ServoSDK_SaveParamsFailed,      //保存参数失败
    ServoSDK_Unknown = 255          //未知错误
};

/**
 * @brief SDK初始化
 * @param nCommType 通信方式：0 CANopen；1 EtherCAT; 2 Modbus
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_init(int nCommType);


/**
 * @brief SDK 反初始化
 */
NIMSERVOSDKSHARED_EXPORT
void NIMAPI NIMAPI Nim_clean();

/**
 * @brief 启动通信主站
 * @param conn_str 连接字符串，json格式，具体内容参见使用手册
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_master_run(const char* conn_str);

/**
 * @brief 关闭通信主站
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_master_stop();

/**
 * @brief 主站进入PreOP模式
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_master_changeToPreOP();


/**
 * @brief 主站进入OP模式
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_master_changeToOP();

/**
 * @brief 按照指定的地址范围扫描从站是否在线
 * @param from 起始地址
 * @param to 结束地址
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_scan_nodes(int from, int to);

/**
 * @brief 查询从站是否在线
 * @param nodeId 从站地址
 * @return 非零 在线；0 不在线
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_is_online(int nodeId);

/**
 * @brief 读取从站PDO配置
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_read_PDOConfig(int nodeId);

/**
 * @brief 加载电机参数表
 * @param nodeId 从站地址
 * @param db_name 参数表数据库文件名
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_load_params(int nodeId, const char* db_name);

/**
 * @brief 读取从站参数
 * @param nodeId 从站地址
 * @param pParamNO 参数编号
 * @param puiValue 参数值
 * @param bSDO 1 使用SDO读；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_param_value(int nodeId, const char* pParamNO, unsigned int *puiValue, int bSDO);

/**
 * @brief 设置从站参数
 * @param nodeId 从站地址
 * @param pParamNO 参数编号
 * @param uiValue 参数值
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_param_value(int nodeId, const char* pParamNO, unsigned int uiValue, int bSDO);

/**
 * @brief 电机抱机
 * @param nodeId 从站地址
 * @param bSDO 1 使用SDO控制；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_power_on(int nodeId, int bSDO);

/**
 * @brief 电机脱机
 * @param nodeId 从站地址
 * @param bSDO 1 使用SDO控制；0 使用PDO
 * @return true 成功；false 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_power_off(int nodeId, int bSDO);

/**
 * @brief 设置控制字(6040)
 * @param nodeId 从站地址
 * @param cw 控制字
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_controlWord(int nodeId, unsigned short cw, int bSDO);

/**
 * @brief 获取电机状态字(6041)
 * @param nodeId 电机地址
 * @param sw 输出参数，成功时返回电机状态字
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_statusWord(int nodeId, unsigned short *sw, int bSDO);

/**
 * @brief 设置电机工作模式（6060,在脱机状态下设置）
 * @param nodeId 电机地址
 * @param mode 模式
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_workMode(int nodeId, int mode, int bSDO);

/**
 * @brief 获取电机工作模式显示值(6061)
 * @param nodeId 电机地址
 * @param mode 输出参数，成功时返回电机工作模式
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_workModeDisplay(int nodeId, int* mode, int bSDO);

/**
 * @brief 原点回归
 * @param nodeId 轴地址
 * @param type 回原点方式
 * @param bSDO 1 使用SDO控制；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_goHome(int nodeId, int type, int bSDO);

/**
 * @brief 轮廓速度模式下正转
 * @param nodeId 轴地址
 * @param fVelocity 速度（用户单位/s）
 * @param bSDO 1 使用SDO控制；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_forward(int nodeId, double fVelocity, int bSDO);

/**
 * @brief 轮廓速度模式下反转
 * @param nodeId 轴地址
 * @param fVelocity 速度（用户单位/s）
 * @param bSDO 1 使用SDO控制；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_backward(int nodeId, double fVelocity, int bSDO);

/**
 * @brief 设置目标速度(60FF)
 * @param nodeId 从站地址
 * @param fVelocity 目标速度（用户单位/s）
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_targetVelocity(int nodeId, double fVelocity, int bSDO);

/**
 * @brief 设置VM模式下的目标速度
 * @param nodeId 从站地址
 * @param speed 目标速度（rpm）
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_vmTargetSpeed(int nodeId, int speed, int bSDO);

/**
 * @brief 获取VM模式下的当前速度
 * @param nodeId 从站地址
 * @param speed 输出参数，成功时返回当前速度（rpm）
 * @param bSDO 1 使用SDO读；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_vmCurrentSpeed(int nodeId, int *speed, int bSDO);

/**
 * @brief 轮廓位置模式下绝对位置运动
 * @param nodeId 轴地址
 * @param target 目标位置（用户单位）
 * @param bChangeImmediatly 是否立即更新：1 立即更新；0 非立即更新
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_moveAbsolute(int nodeId, double position, int bChangeImmediatly, int bSDO);

/**
 * @brief 轮廓位置模式下相对位置运动
 * @param nodeId 轴地址
 * @param distance 目标位置（用户单位）
 * @param bChangeImmediatly 是否立即更新：1 立即更新；0 非立即更新
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_moveRelative(int nodeId, double distance, int bChangeImmediatly, int bSDO);

/**
 * @brief 设置目标位置(607A)
 * @param nodeId 从站地址
 * @param fPos 目标位置（用户单位）
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_targetPosition(int nodeId, double fPos, int bSDO);

/**
 * @brief 设置插补位置(60C1:01)
 * @param nodeId 从站地址
 * @param fPos  位置（用户单位）
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_ipPosition(int nodeId, double fPos, int bSDO);


/**
 * @brief 设置目标转矩(6071)
 * @param nodeId 从站地址
 * @param torque  目标转矩（0.001倍额定转矩）
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_targetTorque(int nodeId, int torque, int bSDO);


/**
 * @brief 获取当前转矩(6077)
 * @param nodeId 从站地址
 * @param torque 输出参数，成功时返回当前转矩（0.001倍额定转矩）
 * @param bSDO 1 使用SDO写；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_currentTorque(int nodeId, int* torque, int bSDO);

/**
 * @brief 快速停止当前动作
 * @param nodeId 轴地址
 * @param bSDO 1 使用SDO控制；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_fastStop(int nodeId, int bSDO);

/**
 * @brief 清除轴故障
 * @param nodeId 轴地址
 * @param bSDO 1 使用SDO控制；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_clearError(int nodeId, int bSDO);

/**
 * @brief 获取最新报警(603F)
 * @param nodeId 轴地址
 * @param alarmCode 输出参数，执行成功时返回报警码
 * @param bSDO 1 使用SDO控制；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_newestAlarm(int nodeId, unsigned int *alarmCode, int bSDO);

/**
 * @brief 获取历史报警数量(1003:00)
 * @param nodeId 轴地址
 * @param alarmCode 输出参数，执行成功时返回历史报警数量
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_alarmCount(int nodeId, int *count);

/**
 * @brief 获取历史报警(1003:01~10h)
 * @param nodeId 轴地址
 * @param index 历史报警序号,取值范围：1~16
 * @param alarmCode 输出参数，执行成功时返回报警码
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_alarm(int nodeId, int index, unsigned int *alarmCode);

/**
 * @brief 获取轮廓速度(6081)
 * @param nodeId 轴地址
 * @param fVelocity 速度（用户单位/s）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_profileVelocity(int nodeId, double* fVelocity);

/**
 * @brief 获取轮廓加速度(6083)
 * @param nodeId 轴地址
 * @param accel 加速度（用户单位/s^2）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_profileAccel(int nodeId, double* accel);

/**
 * @brief 获取轮廓减速度(6084)
 * @param nodeId 轴地址
 * @param decel 减速度（用户单位/s^2）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_profileDecel(int nodeId, double* decel);

/**
 * @brief 获取快速停机减速度(6085)
 * @param nodeId 轴地址
 * @param decel 减速度（用户单位/s^2）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_quickStopDecel(int nodeId, double* decel);

/**
 * @brief 设置轮廓速度(6081)
 * @param nodeId 轴地址
 * @param fVelocity 速度（用户单位/s）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_profileVelocity(int nodeId, double fVelocity);

/**
 * @brief 设置轮廓加速度(6083)
 * @param nodeId 轴地址
 * @param accel 加速度（用户单位/s^2）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_profileAccel(int nodeId, double accel);

/**
 * @brief 设置轮廓减速度(6084)
 * @param nodeId 轴地址
 * @param decel 减速度（用户单位/s^2）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_profileDecel(int nodeId, double decel);

/**
 * @brief 设置快速停机减速度(6085)
 * @param nodeId 轴地址
 * @param decel 减速度（用户单位/s^2）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_quickStopDecel(int nodeId, double decel);

/**
 * @brief 获取原点偏移
 * @param nodeId 轴地址
 * @param offset 原点偏移，用户单位
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_homeOffset(int nodeId, double* offset);

/**
 * @brief 获取原点回归速度(6099:01/02)
 * @param nodeId 轴地址
 * @param velocity1 寻找开关速度（用户单位/s）
 * @param velocity2 寻找原点速度（用户单位/s）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_goHome_velocity(int nodeId, double* velocity1, double* velocity2);

/**
 * @brief 获取原点回归加速度(609A)
 * @param nodeId 轴地址
 * @param accel 加速度（用户单位/s^2）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_goHome_accel(int nodeId, double* accel);

/**
 * @brief 设置原点偏移
 * @param nodeId 轴地址
 * @param offset 原点偏移，用户单位
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_homeOffset(int nodeId, double offset);

/**
 * @brief 设置原点回归速度(6099:01/02)
 * @param nodeId 轴地址
 * @param velocity1 寻找开关速度（用户单位/s）
 * @param velocity2 寻找原点速度（用户单位/s）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_goHome_velocity(int nodeId, double velocity1, double velocity2);

/**
 * @brief 设置原点回归加速度(609A)
 * @param nodeId 轴地址
 * @param accel 加速度（用户单位/s^2）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_goHome_accel(int nodeId, double accel);

/**
 * @brief 获取VM模式下的加速度
 * @param nodeId 从站地址
 * @param accel 输出参数，成功时返回加速度（rpm/s）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_vmAccel(int nodeId, double* accel);

/**
 * @brief 设置VM模式下的加速度
 * @param nodeId 从站地址
 * @param deltaV 速度变化量（rpm）
 * @param deltaT 时间变化量（S）
 *        加速度 = deltaV/deltaT
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_vmAccel(int nodeId, unsigned int deltaV, unsigned int deltaT);

/**
 * @brief 获取VM模式下的减速度
 * @param nodeId 从站地址
 * @param accel 输出参数，成功时返回减速度（rpm/s）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_vmDecel(int nodeId, double* decel);

/**
 * @brief 设置VM模式下的减速度
 * @param nodeId 从站地址
 * @param deltaV 速度变化量（rpm）
 * @param deltaT 时间变化量（S）
 *        减速度 = deltaV/deltaT
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_vmDecel(int nodeId, unsigned int deltaV, unsigned int deltaT);

/**
 * @brief 通过6064获取当前位置
 * @param nodeId 轴地址
 * @param position 输出参数，执行成功时返回当前位置
 * @param bSDO 1 使用SDO输出；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_currentPosition(int nodeId, double* position, int bSDO);

/**
 * @brief 通过6069获取当前速度
 * @param nodeId 轴地址
 * @param velocity 输出参数，执行成功时返回当前速度（用户单位/s）
 * @param bSDO 1 使用SDO输出；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_currentVelocity(int nodeId, double* velocity, int bSDO);

/**
 * @brief 通过606C获取当前速度
 * @param nodeId 轴地址
 * @param velocity 输出参数，执行成功时返回当前速度（用户单位/s）
 * @param bSDO 1 使用SDO输出；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_currentVelocity2(int nodeId, double* velocity, int bSDO);


/**
 * @brief 通过606C获取当前电机速度
 * @param nodeId 轴地址
 * @param speed 输出参数，执行成功时返回当前速度（rpm）
 * @param bSDO 1 使用SDO输出；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_currentMotorSpeed(int nodeId, int* speed, int bSDO);

/**
 * @brief 获取位置限制值(607D:01/02)
 * @param nodeId 轴地址
 * @param minPos 输出参数，执行成功时返回最小极限位置
 * @param maxPos 输出参数，执行成功时返回最大极限位置
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_posLimit(int nodeId, double* minPos, double* maxPos);

/**
 * @brief 设置位置限制值(607D:01/02)
 * @param nodeId 轴地址
 * @param pos 输出参数，执行成功时返回最大极限位置
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_posLimit(int nodeId, double minPos, double maxPos);

/**
 * @brief 获取最大速度(607F)
 * @param nodeId 轴地址
 * @param velocity 输出参数，成功时返回最大速度（用户单位/s）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_maxVelocity(int nodeId, double* velocity);


/**
 * @brief 设置最大速度(607F)
 * @param nodeId 轴地址
 * @param velocity 最大速度（用户单位/s）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_maxVelocity(int nodeId, double velocity);


/**
 * @brief 获取最大电机速度(6080)
 * @param nodeId 从站地址
 * @param torque 输出参数，成功时返回最大电机速度（rpm）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_maxMotorSpeed(int nodeId, unsigned int* speed);

/**
 * @brief 设置最大电机速度(6080)
 * @param nodeId 从站地址
 * @param torque  最大电机速度（rpm）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_maxMotorSpeed(int nodeId, unsigned int speed);


/**
 * @brief 获取最大转矩(6072)
 * @param nodeId 从站地址
 * @param torque 输出参数，成功时返回最大转矩（0.001倍额定转矩）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_maxTorque(int nodeId, unsigned int* torque);

/**
 * @brief 设置最大转矩(6072)
 * @param nodeId 从站地址
 * @param torque  最大转矩（0.001倍额定转矩）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_maxTorque(int nodeId, unsigned int torque);

/**
 * @brief 获取VM模式下的速度限制值
 * @param nodeId 从站地址
 * @param minSpeed 最小速度（rpm）
 * @param maxSpeed 最大速度（rpm）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_vmSpeedLimit(int nodeId, unsigned int* minSpeed, unsigned int* maxSpeed);

/**
 * @brief 设置VM模式下的速度限制值
 * @param nodeId 从站地址
 * @param minSpeed 最小速度（rpm）
 * @param maxSpeed 最大速度（rpm）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_vmSpeedLimit(int nodeId, unsigned int minSpeed, unsigned int maxSpeed);

/**
 * @brief 获取用户单位的转换系数
 * @param nodeId 轴地址
 * @param factor 转换系数（电机编码器单位/用户单位）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_unitsFactor(int nodeId, double* factor);

/**
 * @brief 设置用户单位的转换系数
 * @param nodeId 轴地址
 * @param factor 转换系数（电机编码器单位/用户单位）
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_unitsFactor(int nodeId, double factor);

/**
 * @brief  设置DO输出
 * @param nodeId 轴地址
 * @param nDOs DO值：每位表示一路DO：bit0表示DO1；bit1表示DO2，以此类推
 *                  1 输出高电平；0 输出低电平
 * @param bSDO 1 使用SDO输出；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_DOs(int nodeId, unsigned int nDOs, int bSDO);


/**
 * @brief  设置VDI值
 * @param nodeId 轴地址
 * @param nVDIs VDI值：每位表示一路VDI：bit0表示VDI1；bit1表示VDI2，以此类推
 *                  1 输出高电平；0 输出低电平
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_set_VDIs(int nodeId, unsigned int nVDIs);

/**
 * @brief  读取DI输入
 * @param nodeId 轴地址
 * @param nDIs DI值：每位表示一路DI：bit0表示DI1；bit1表示DI2，以此类推
 *                  1 输入高电平；0 输入低电平
 * @param bSDO 1 使用SDO读取；0 使用PDO
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_get_DIs(int nodeId, unsigned int* nDIs, int bSDO);

/**
 * @brief 保存所有参数到设备
 * @param nodeId 从站地址
 * @param timeoutMS 超时时间，单位：ms
 * @return 0 成功；其它 失败
 */
NIMSERVOSDKSHARED_EXPORT
int NIMAPI Nim_save_AllParams(int nodeId, int timeoutMS);

#ifdef __cplusplus
}
#endif


#endif // NIMSERVOSDK_H
